Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

 << zurück
Visual C# 2005 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2005

Visual C# 2005
1.320 S., mit 2 CDs, 59,90 Euro
Galileo Computing
ISBN 3-89842-586-X
gp Kapitel 19 Weitere Steuerelemente
  gp 19.1 Bildlaufleisten mit »HScrollBar« und »VScrollBar«
  gp 19.2 Schieberegler mit der Klasse »TrackBar«
  gp 19.3 Das »ProgressBar«-Steuerelement
  gp 19.4 Drehfeld-Steuerelemente (»UpDown«-Steuerelemente)
    gp 19.4.1 Das »NumericUpDown«-Steuerelement
    gp 19.4.2 Das »DomainUpDown«-Steuerelement
  gp 19.5 Das »Timer«-Steuerelement
  gp 19.6 Die Klasse »ErrorProvider«
  gp 19.7 Steuerelemente für die Datums- und Zeitangabe
    gp 19.7.1 Das Steuerelement »MonthCalendar«
    gp 19.7.2 Das Steuerelement »DateTimePicker«
  gp 19.8 Das »Panel«-Steuerelement
  gp 19.9 Das Steuerelement »NotifyIcon«
  gp 19.10 Bildanzeige mit »PictureBox«
  gp 19.11 Eine Liste mit Symbolen mit »ImageList« bereitstellen
    gp 19.11.1 Die Eigenschaften der Klasse »ImageList«
    gp 19.11.2 Die Bildliste füllen
  gp 19.12 Registerkarten mit »TabControl«
    gp 19.12.1 Die Klasse »TabControl«
    gp 19.12.2 Objekte vom Typ »TabPage«
  gp 19.13 Das »TreeView«-Steuerelement
    gp 19.13.1 Knotenpunkte im »TreeView« definieren
    gp 19.13.2 Eigenschaften des »TreeView«-Steuerelements
    gp 19.13.3 Die Unterstützung der Entwicklungsumgebung
    gp 19.13.4 Die Ereignisse des »TreeView«-Steuerelements
    gp 19.13.5 Weitere Eigenschaften und Methoden des »TreeView«-Objekts
    gp 19.13.6 Eigenschaften und Methoden des »TreeNode«-Objekts
    gp 19.13.7 Beispiel zum Einlesen der Verzeichnisstruktur
  gp 19.14 Die beiden »Splitter«-Steuerelemente
    gp 19.14.1 Das Steuerelement »Splitter«
    gp 19.14.2 Das Steuerelement »SplitContainer«
  gp 19.15 Das »ListView«-Steuerelement
    gp 19.15.1 Die Klassen des »ListView«-Steuerelements
    gp 19.15.2 Die Eigenschaften der »ListView«
    gp 19.15.3 Listenelemente vom Typ »ListViewItem«
    gp 19.15.4 Das Element »ListViewSubItem«
    gp 19.15.5 Der Typ »ColumnHeader«
    gp 19.15.6 Listenelemente Gruppen zuordnen
    gp 19.15.7 Sortierung der Spalten
    gp 19.15.8 Listenelemente ändern
    gp 19.15.9 Beispielanwendung
  gp 19.16 BackGroundWorker


Galileo Computing

19.16 BackGroundWorker  toptop

In Kapitel 11 haben Sie bereits alles Wichtige im Zusammenhang mit den Threads kennen gelernt. In der Toolbox wird Ihnen mit BackgroundWorker noch eine weitere Möglichkeit angeboten, auf sehr einfache Weise einen Hintergrundthread ins Leben zu rufen, in dem neben dem UI-Thread zeitintensive Operationen ausgeführt werden können. Dazu ist noch nicht einmal notwendig, einen neuen Thread zu erzeugen, alles wird vom Steuerelement automatisch in die Hand genommen. Automatisch bedeutet natürlich nicht, dass Sie die Hände in den Schoß legen können. Aber die Eigenschaften, Methoden und Ereignisse sind von der Anzahl her überschaubar und leicht zu programmieren.

Nachdem Sie das Steuerelement in die Form gezogen haben, müssen Sie nur die Methode RunWorkerAsync aufrufen, um den neuen Thread zu starten. Die Methode ist überladen und gestattet neben dem parameterlosen Aufruf auch die Übergabe eines Arguments an die Thread-Operation. Da die Überladung vom Typ Object ist, können Sie innerhalb eines Arrays oder einer Collection natürlich auch beliebig viele Argumente übergeben.

RunWorkerAsync hat die Auslösung des Ereignisses DoWork zur Folge. Es ist eins von insgesamt drei Ereignissen des Steuerelements und auch das einzige, das nicht im Kontext des UI-, sondern in dem des Hintergrundthreads ausgeführt wird. Hier implementieren Sie die Operationen, die vom Hintergrundthread abgearbeitet werden sollen. Die übergebenen Argumente greifen Sie über die Eigenschaft Argument des DoWorkEventArgs-Objekts im Ereignishandler ab.

Der Aufrufer muss möglicherweise während der laufenden Operationen zwischenzeitlich vom aktuellen Stand der laufenden Operation informiert werden. Rufen Sie dazu nur die Methode ReportProgress auf das BackgroundWorker-Objekt auf, und übergeben Sie eine Zahl zwischen 0 und 100, die in Prozent den augenblicklichen Fortschritt beschreibt. Auch durch diesen Methodenaufruf wird ein Ereignis ausgelöst: ProgressChanged. Allerdings dürfen Sie nicht vergessen, vorher die Eigenschaft WorkerReportsProgress=true zu setzen. Ansonsten sehen Sie sich mit einer Exception konfrontiert.

RunWorkerCompleted ist das dritte Ereignis des BackgroundWorker-Objekts und wird ausgelöst, wenn der Hintergrundvorgang entweder abgeschlossen ist, abgebrochen wurde oder eine Ausnahme ausgelöst hat. Liefert die Operation ein abschließendes Resultat, rufen Sie das über die Eigenschaft Result des RunWorkerCompletedEventsArgs-Objekt ab.

Das wollen wir uns nun an einem Beispiel ansehen. Grundlage dazu soll das Beispiel sein, das im Zusammenhang mit der Vorstellung des ProgressBar-Steuerelements gezeigt wurde. Es soll nun so umgeschrieben werden, dass die länger andauernde Operation (das Lesen einer Textdatei) in einem durch BackgroundWorker bereitgestellten Hintergrundthread ausgeführt wird.


// ---------------------------------------------------------
// Beispiel: ...\Kapitel 19\BackgroundWorkerDemo
// ---------------------------------------------------------
public partial class Form1 : Form {
  private string file = @"C:\Test.txt";
  public Form1() {
    InitializeComponent();
    // Datei erzeugen und mit Zeichen füllen
    FileStream fs = File.Open(file, FileMode.Create);
    byte b = 97;
    for (int i = 0; i < 20000; i++) {
      fs.WriteByte(b++);
      if (b == 123) b = 97;
    }
    fs.Close();
  }
  private void button1_Click(object sender, EventArgs e) {
    textBox1.Clear();
    textBox1.Refresh();
    // ProgressBar einstellen
    proFuellen.Maximum = 100;
    proFuellen.Step = 1;
    proFuellen.Value = 0;
    // BackGroundWorker starten
    this.backgroundWorker1.RunWorkerAsync(file);
  }
  private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
    File.Delete(file);
  }
  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){   
    int var = 0;
    string text = "";
    // Datei öffnen
    FileStream fs = File.Open(e.Argument.ToString(), FileMode.Open);
    FileInfo fi = new FileInfo(file);
    // Dateigröße
    int fileLength = (int)new FileInfo(file).Length;
    int counter = 0;
    while (true) {
      var = fs.ReadByte();
      // wenn Datei eingelesen, Schleife beenden
      if (var == –1)
        break;
      text += Convert.ToChar(var);
      // Das Ereignis 'ProgressChanged' auslösen
      counter++;
      this.backgroundWorker1.ReportProgress(counter * 100 / fileLength);
    }
    e.Result = text;
    fs.Close();
  }
  private void backgroundWorker1_ProgressChanged(object sender, 
                        ProgressChangedEventArgs e) {
    // ProgressBar einstellen
    proFuellen.Value = e.ProgressPercentage;
  }
private void backgroundWorker1_RunWorkerCompleted(object sender, 
                            RunWorkerCompletedEventArgs e) {
    this.textBox1.Text = Convert.ToString(e.Result);
    this.proFuellen.Value = 0;
  }
}


Hinweis   Sie können das Steuerelement BackgroundWorker auch außerhalb von Windows-Anwendungen benutzen. Dazu instanziieren Sie die gleichnamige Klasse, die zum Namespace System.ComponentModel gehört.

 << zurück
  
  Zum Katalog
Zum Katalog: Visual C# 2005
Visual C# 2005
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Fortgeschrittene Programmierung mit Visual C# 2005






 Fortgeschrittene
 Programmierung
 mit Visual C# 2005


Zum Katalog: Einstieg in Visual C# 2005






 Einstieg in
 Visual C# 2005


Zum Katalog: Einstieg in Visual Basic 2005






 Einstieg in
 Visual Basic 2005


Zum Katalog: Visual Basic 2005






 Visual Basic 2005


Zum Katalog: Java ist auch eine Insel






 Java ist auch eine
 Insel


Zum Katalog: Konzepte und Lösungen für Microsoft-Netzwerke






 Konzepte und
 Lösungen für
 Microsoft-Netzwerke


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de